\documentclass[a4paper]{article}
\usepackage[a4paper,margin=2cm,top=1.5cm,bottom=2.34cm]{geometry}
\usepackage[spanish,activeacute]{babel}
\usepackage[T1]{fontenc}
\usepackage{algo2symb}
\usepackage{newalgo}

\parskip=1.5ex
\pagestyle{empty}

\newcommand\interfaz[5]{\noindent \\#1\ifblank{#2}\then{}\else{(#2)}\fi \ifblank{#3}\then{}\else{$\rightarrow$ #3}\fi \\ \{$#4$\} \\ \{$#5$\}}
\newcommand\estr[2]{\noindent #1 src estr\_#1 donde estr\_#1 es:\\ #2}
\newcommand\rep[2]{\noindent Rep: estr\_#1 $\rightarrow$ bool\\ Rep(e) = $#2$}
\newcommand\abs[3]{\noindent Abs: estr\_ #1 e $\rightarrow$ #1 Rep(e)\\ Abs(e) = #2 / \\ $#3$}
\newcommand\complejidad[2]{\noindent \comentario{Complejidad: \Ode{#1}\ifblank{ #2}\then{}\else{(#2)}\fi}}
% \param{in}{}{}
% \igobs
% {}_{0}
% \wedge

\begin{document}

\begin{center}\textbf{\Large M'odulo \nombretad{constructora}}\\
Se explica con la especificacion de constructora
\end{center}

\noindent\textbf{usa:} catalogo, multiconj\_stock, multiconj\_material, pendientes

\noindent \textbf{Interfaz}

\complejidad{1}{}
\interfaz{Catalogo}{\param{in}{c}{estr\_constructora}}{res\!: catalogo}{true}{res $\igobs$ Catalogo(c)} \\

\complejidad{1}{}
\interfaz{Stock}{\param{in}{c}{constructora}}{res\!: multiconj\_stock}{true}{res $\igobs$ Stock(c)} \\

\complejidad{1}{}
\interfaz{Deuda}{\param{in}{c}{constructora}}{res\!: multiconj\_material}{true}{res $\igobs$ Deuda(c)} \\

\complejidad{1}{}
\interfaz{Pendientes}{\param{in}{c}{constructora}}{res\!: secu(vivienda)}{true}{res $\igobs$ Pendientes(c)} \\

\complejidad{\texttt{cantidad\_materiales(c)}+\texttt{cantidad\_viviendas(c)}}{}
\interfaz{Abrir}{\param{in}{c}{catalogo}}{res\!: constructora}{true}{res $\igobs$ Abrir(c)} \\

\complejidad{log(tam(c.stock))}{}
\interfaz{Construir}{\param{in}{v}{vivienda}, \param{inout}{c}{constructora}}{}{c \igobs {c}_{0} \wedge v \in Viviendas(Catalogo(c))}{c \igobs Construir(v,{c}_{0})} \\

\complejidad{k + t}{donde t es la cantidad de viviendas pendientes que requieren m para su construccion y k es la cantidad de materiales distintos del catalogo.}
\interfaz{Comprar}{\param{in}{m}{material}, \param{in}{n}{nat}, \param{inout}{c}{constructora}}{}{c \igobs {c}_{0} \wedge m \in TodosLosMateriales(Catalogo(c))}{c \igobs Comprar(m,n,{c}_{0})} \\

\complejidad{log(\texttt{cantidad\_materiales})}{}
\interfaz{Donar}{\param{inout}{c}{constructora}}{}{c \igobs {c}_{0} \wedge \neg \emptyset ?(Stock(c)) \wedge_L \#(Stock(c),MasAbundante(c)) \geq 5}{c \igobs Donar({c}_{0})}

\newpage

\noindent \textbf{Estructura}

\estr{constructora}{< catalogo: catalogo $\times$ stock: multiconj\_stock $\times$ deuda: multiconj\_materiales $\times$ pendientes: pendientes >}
\\
\\

\noindent \textbf{Invariante de representacion}

\rep{estr\_constructora}{StockValido \wedge DeudaValida \wedge PagueLoQuePude \wedge SoloPediUnaVez \wedge
	\\ \hspace*{4em} PendientesValidas \wedge NoHayDeudaNoHayPendientes \wedge MeFaltaAlgo}

\noindent \textit{Para todo material con cardinal $>$ 0 en stock existe al menos una vivienda en catalogo tal que necesita dicho material para su contruccion.}\\
\noindent \textbf{\small{StockValido}}{ = ($\forall$ m:material, Esta(m,e.stock)) ($\exists$ v:vivienda,v $\in$ Viviendas(e.catalogo)) Esta(m,Materiales(v, e.catalogo))}\\

\noindent \textit{Para todo material en deuda existe una vivienda en catalogo tal que necesita dicho material para su contruccion.}\\
\noindent \textbf{\small{DeudaValida}}{ = ($\forall$ m:material, Esta(m,e.deuda))($\exists$ v:vivienda, v $\in$ Viviendas(e.catalogo)) Esta(m,Materiales(v, e.catalogo))}\\

\noindent \textit{Todo material que esta en deuda no pertenece a stock.}\\
\noindent \textbf{\small{PagueLoQuePude}}{ = ($\forall$ m:material, Esta(m,e.deuda)) $\neg$Esta(m,e.stock)}\\

\noindent \textit{Todo material en deuda pertenece a la misma vivienda y la cantidad adeudada es menor o igual a la necesitada.}\\
\noindent \textbf{\small{SoloPediUnaVez}}{ = ($\forall$ m, m':material, m $\neq$ m' $\land$ Esta(m, e.deuda) $\land$ Esta(m',e.deuda))($\exists$ v:vivienda, v $\in$ Viviendas(e.catalogo))Esta(m,Materiales(v, e.catalogo)) $\land$ Esta(m',Materiales(v, e.catalogo))  $\land$ Cardinal(m, e.deuda) $\leq$ Cardinal(m, materiales(v, e.catalogo)) $\land$ Cardinal(m', e.deuda) $\leq$ Cardinal(m', materiales(v, e.catalogo))}\\

\noindent \textit{Toda vivienda en pendientes esta en el catalogo.}\\
\noindent \textbf{\small{PendientesValida}}{ = ($\forall$ v:vivienda, Esta(v, e.pendientes)) v $\in$ Viviendas(e.catalogo)}\\

\noindent \textit{Si la deuda es vacia no hay viviendas pendientes.}\\
\noindent \textbf{\small{NoHayDeudaNoHayPendientes}}{ = EsVacio?(e.deuda) $\rightarrow$ EsVacia?(e.pendientes)}\\

\noindent \textit{Para toda vivienda en pendientes existe por lo menos un material necesario para su construcci'on del cual no tengo la cantidad necesaria en el stock.}\\
\noindent \textbf{\small{MeFaltaAlgo}}{ = ($\forall$ v:vivienda, Esta(v, e.pendientes))($\exists$ m:material, m $\in$ Materiales(v, e.catalogo))
	Cardinal(m, e.stock) $<$ Cardinal(m, materiales(v, e.catalogo))}\\
\\
\\	

\noindent \textbf{Funcion de abstraccion}

\abs{constructora}{c}{\hspace*{1em} Catalogo(c) = e.catalogo \wedge \\ \hspace*{1em} Stock(c) = e.stock \wedge \\ \hspace*{1em} Deuda(c) = e.deuda \wedge \\ \hspace*{1em} Pendientes(c) = Cola(e.pendientes)s}
\\
\\

\newpage	
	

\noindent \textbf{Algoritmos} 

\begin{algorithm}{iCatalogo}{\param{in}{c}{estr\_constructora}}{res\!: catalogo}
res \= c.catalogo \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iStock}{\param{in}{c}{estr\_constructora}}{res\!: multiconj\_stock}
res \= c.stock \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iDeuda}{\param{in}{c}{estr\_constructora}}{res\!: multiconj\_materiales}
res \= c.deuda \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iPendientes}{\param{in}{c}{estr\_constructora}}{res\!: secu(vivienda)}
res \= Cola(c.pendientes) \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iAbrir}{\param{in}{c}{catalogo}}{res\!: constructora}
	\VAR{m\!: nat} \= 0 \comentario{cantidad de materiales en el catalogo = max(material $\in$ catalogo)}\\
	\VAR{n\!: nat} \= CantidadViviendas(c) \comentario{\Ode{1}} \\
	\VAR{i\!: nat} \= 0 \\
	\begin{WHILE}{i<n}
		\VAR{it\!: iterMateriales} \= CrearIterMateriales(c,i)\\
		\begin{WHILE}{TieneProximo(it)}
		\VAR{actual: material \= iAvanzar(it)}\\
			\begin{IF}{actual > m}
				m \= actual
			\end{IF}
		\end{WHILE} \\
		i++
	\end{WHILE} \\
	res \= $\cuadrupla{catalogo: $c$}{stock: $Nuevo(m)$}{deuda: $Vacio$}{pendientes: $Vacia(c,m)$}$  \comentario{\Ode{m+m} = \Ode{m}}\\
	\comentario{el while de las lineas 7:10 se ejecuta \texttt{cantidad\_materiales\_vivienda\_i} veces, que es constante, entonces es \Ode{1}}\\
	\comentario{el while de las lineas 5:11 se ejecuta \texttt{n} veces (la cantidad de viviendas), entonces es \Ode{n}}\\
	\comentario{Complejidad: \Ode{\texttt{cantidad\_materiales(c)}+\texttt{cantidad\_viviendas(c)}}}
\end{algorithm}

\begin{algorithm}{iConstruir}{\param{in}{v}{vivienda}, \param{inout}{c}{estr\_constructora}}{}
\begin{IF}{PuedoConstruir(v,c) \hspace*{8em}\comentario{\Ode{1}}}
	iConstruirVivienda(v,c) \hspace*{4em}\comentario{\Ode{log(tam(c.stock))}}
\ELSE
	iEncolar(v,c.pendientes) \hspace*{4em}\comentario{\Ode{1}}
\end{IF}
\end{algorithm}

\begin{algorithm}{iComprar}{\param{in}{m}{material},\param{in}{n}{nat}, \param{inout}{c}{estr\_constructora}}{}
\VAR{meQueda\!: nat} \= n - min(n,iCardinal(m,c.deuda))\\
 \comentario{\Ode{\texttt{cant\_materiales\_deuda}} = \Ode{1} porque la deuda es siempre $\leq$ cantidad de materiales de una vivienda = constante} \\
iSacar(m,n,c.deuda) \hspace*{10em}\comentario{\Ode{\texttt{cant\_materiales\_deuda}} = \Ode{1}}\\
\begin{IF}{iEsVacio?(c.deuda) \vee meQueda > 0 \hspace*{3em}\comentario{\Ode{1}}} 
\VAR{cant\!:nat} \= iCantMateriales(c.stock) \hspace*{12em}\comentario{\Ode{1}}\\
\VAR{a\!: arreglo\_dimensionable(nat)} \= iCrearArreglo(cant) \hspace*{3.5em}\comentario{\Ode{1}}\\
\begin{FOR}{i \= 0 \TO cant}
	a[i] \= iCardinal(i,c.stock) \hspace*{16em}\comentario{\Ode{1}}
\end{FOR}\\
a[m]\= a[m] + meQueda \\
\VAR{it\_p\!: iter\_pendientes} \= iCrearIterPendientes(c.pendientes,m) \\
\begin{WHILE}{iTieneProximo(it\_p) \hspace*{13em}\comentario{\Ode{\texttt{cant\_viviendas\_pendientes\_con\_material\_m}}}}
	\VAR{v\!: vivienda} \= (iActual(it\_p)) \\
	\begin{IF}{iPuedoConstruirArray(v,c,a) \hspace*{13.5em}\comentario{\Ode{1}}}
		iConstruirViviendaArray(v,c,a) \hspace*{9.5em}\comentario{\Ode{1}}\\
		iEliminar(it\_p) \hspace*{12.5em}\comentario{\Ode{1}}
	\end{IF} \\
	iAvanzar(it\_p)
\end{WHILE} \\
iActualizarStock(a,c.stock) \hspace*{18em}\comentario{\Ode{\texttt{cant}} = \Ode{\texttt{cantidad\_materiales}}}
\end{IF} \\
\comentario{Complejidad: \Ode{k+t}, donde k=\texttt{cantidad\_materiales} y t=\texttt{cant\_viviendas\_pendientes\_con\_material\_m}}
\end{algorithm}

\newpage

\begin{algorithm}{Donar}{\param{inout}{c}{estr\_constructora}}{}
\VAR{m\!: material} \= iElQueMasHay(c.stock) \hspace*{3em}\comentario{\Ode{1}}\\
\VAR{n\!: nat} \= Cardinal(m,c.stock)/5 \hspace*{7em}\comentario{\Ode{1}}\\
iSacar(m,n,c.stock) \hspace*{14em}\comentario{\Ode{log(\texttt{cant\_materiales})}}
\end{algorithm}

\noindent \textbf{Algoritmos auxiliares} \\

\begin{algorithm}{PuedoConstruir}{\param{in}{v}{vivienda}, \param{in}{c}{estr\_constructora}}{res\!: bool}
\VAR{it\_m\!: iterMateriales} \= iCrearIterMateriales(c.catalogo,v) \\
res \= true \\
\VAR{deuda\!: bool} \= \neg iEsVacio?(c.deuda) \\
\begin{WHILE}{res \wedge iTieneProximo(it\_m)}
		\VAR{material\!: material} \= iAvanzar(it\_m)\\
		\VAR{loQueNecesito \!: nat} \= iCardinal(material,iMateriales(c.catalogo,v)) \\
		\begin{IF}{Cardinal(material,c.stock) < loQueNecesito \wedge deuda}
			res \= false
		\end{IF}
	\end{WHILE} \\
	\comentario{Complejidad: \Ode{1} porque itera sobre los materiales de una vivienda (constante) y todas las operaciones son \Ode{1}}
\end{algorithm}

\begin{algorithm}{PuedoConstruirArray}{\param{in}{v}{vivienda}, \param{in}{c}{constructora}, \param{in}{a}{arreglo\_dimensionable(nat)}}{res\!: bool}
\VAR{it\_m\!: iterMateriales} \= iCrearIterMateriales(c.catalogo,v) \\
res \= true \\
\VAR{deuda\!: bool} \= \neg iEsVacio?(c.deuda) \\
\begin{WHILE}{res \wedge iTieneProximo(it\_m)}
		\VAR{material\!: material} \= iAvanzar(it\_m) \\
		\VAR{loQueNecesito \!: nat} \= iCardinal(material,iMateriales(c.catalogo,v)) \\
		\begin{IF}{a[material] < loQueNecesito \wedge deuda}
			res \= false
		\end{IF}
	\end{WHILE} \\
	\comentario{Complejidad: \Ode{1} porque itera sobre los materiales de una vivienda (constante) y todas las operaciones son \Ode{1}}
\end{algorithm}

\noindent \comentario{Requiere puedoConstruir(v,c)}
\begin{algorithm}{ConstruirVivienda}{\param{in}{v}{vivienda},\param{inout}{c}{constructora}}{}
\VAR{it\_m\!: iterMateriales} \= crearIterMateriales(v,c.catalogo) \\
\begin{WHILE}{iTieneProximo(it\_m)}
	\VAR{material\!: material} \= iAvanzar(it\_m) \\
	\VAR{loQueNecesito\!: nat} \= iCardinal(material,iMateriales(c.catalogo,v))\\
	\VAR{loQueTengo\!: nat} \= iCardinal(material,c.stock) \\
	\begin{IF}{loQueTengo < loQueNecesito}
		iAgregar(material,loQueNecesito-loQueTengo,c.deuda) \\
		iSacar(material,loQueTengo,c.stock) \hspace*{5em}\comentario{\Ode{log(\texttt{cant\_materiales})}}
	\ELSE
		iSacar(material,loQueNecesito,c.stock) \hspace*{4em}\comentario{\Ode{log(\texttt{cant\_materiales})}}
	\end{IF} 
\end{WHILE} \\
	\comentario{Complejidad: \Ode{log(\texttt{cant\_materiales})} porque itera sobre los materiales de una vivienda (constante)}\\
	\comentario{y para cada uno hace un iSacar (\Ode{log(\texttt{cant\_materiales})})}
\end{algorithm}

\noindent \comentario{Requiere puedoConstruirArray(v,c,a)}
\begin{algorithm}{ConstruirViviendaArray}{\param{in}{v}{vivienda},\param{inout}{c}{constructora},\param{inout}{a}{arreglo\_dimensionable(nat)}}{}
\VAR{it\_m\!: iterMateriales} \= crearIterMateriales(v,c.catalogo) \\
\begin{WHILE}{iTieneProximo(it\_m)}
	\VAR{material\!: material} \= iAvanzar(it\_m) \\
	\VAR{loQueNecesito\!: nat} \= iCardinal(material,iMateriales(c.catalogo,v)) \\
	\VAR{loQueTengo\!: nat} \= a[material] \\
	\begin{IF}{loQueTengo < loQueNecesito}
		iAgregar(material,loQueNecesito-loQueTengo,c.deuda) \\
		%iSacar(material,loQueTengo,c.stock)
		a[material] \= a[material] - loQueTengo
	\ELSE
		a[material] \= a[material] - loQueNecesito
	\end{IF} 
\end{WHILE} \\
\comentario{Complejidad: \Ode{1} porque itera sobre los materiales de una vivienda (constante) y todas las operaciones son \Ode{1}}
\end{algorithm}

\end{document}
